﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.Collections.ObjectModel;

namespace RiskMan.DataClass.Models.NotBasModels
{

    /// <summary>
    /// Модель данных для строки Ledders
    /// </summary>
    [Serializable]
    public class LedderItem : INotifyPropertyChanged, ISerializable
    {
        #region private

        private bool _checked = false;

        //Базовые настройки
        private string _Account;
        private string _clientCode;
        private string _Instrument;
        private bool _isRun;
        private Guid _guidLedder;
        //рабочие нстройки робота
        private double _Step;
        private double _Profit;
        private int _Quantity;
        private string _Operation;
        private double _Maxprice;
        private int _SumOrders;
        private int _sumOrdersProfit;
        private int _DeepOrders;
        private ObservableCollection<TradesOpen> _TradeList;
        private Statistics _staticsticItem;


        private int _Poz;
        #endregion

        #region public

        /// <summary>
        /// экземпляр объекта статистика
        /// </summary>
        public Statistics StaticsticItem
        {
            get { return _staticsticItem; }
            set
            {
                if (_staticsticItem != value)
                {
                    _staticsticItem = value;
                    RaisePropertyChanged("StaticsticItem");
                }
            }
        }

        /// <summary>
        /// количество ордеров на закрытие позиции
        /// </summary>
        public int SumOrdersProfit
        {
            get { return _sumOrdersProfit; }
            set
            {
                if (_sumOrdersProfit != value)
                {
                    _sumOrdersProfit = value;
                    RaisePropertyChanged("SumOrdersProfit");
                }
            }
        }

        /// <summary>
        /// уникальный номер элемента
        /// </summary>
        public Guid GuidLedder
        {
            get { return _guidLedder; }
            set
            {
                if (_guidLedder != value)
                {
                    _guidLedder = value;
                    RaisePropertyChanged("GuidLedder");
                }
            }
        }

        /// <summary>
        /// выделен элемент для выполенения операции или нет
        /// </summary>
        public bool Check
        {
            get { return _checked; }
            set
            {
                if (_checked != value)
                {
                    _checked = value;
                    RaisePropertyChanged("Check");
                }
            }
        }

        /// <summary>
        /// Торговый счет
        /// </summary>
        public string Account
        {
            get { return _Account; }
            set
            {
                if (_Account != value)
                {
                    _Account = value;
                    RaisePropertyChanged("Account");
                }
            }
        }

        /// <summary>
        /// Счет депо
        /// </summary>
        public string ClientCode
        {
            get { return _clientCode; }
            set
            {
                if (_clientCode != value)
                {
                    _clientCode = value;
                    RaisePropertyChanged("ClientCode");
                }
            }
        }

        /// <summary>
        /// Торгуемый инструмент
        /// </summary>
        public string Instrument
        {
            get { return _Instrument; }
            set
            {
                if (_Instrument != value)
                {
                    _Instrument = value;
                    RaisePropertyChanged("Instrument");
                }
            }
        }

        /// <summary>
        /// Запуск/остановка работы по данному инструменту
        /// </summary>
        public bool isRun
        {
            get { return _isRun; }
            set
            {
                if (_isRun != value)
                {
                    _isRun = value;
                    RaisePropertyChanged("isRun");
                }
            }
        }

        /// <summary>
        /// Шаг цены между выставляемыми заявками
        /// </summary>
        public double Step
        {
            get { return _Step; }
            set
            {
                if (_Step != value)
                {
                    _Step = value;
                    RaisePropertyChanged("Step");
                }
            }
        }
        /// <summary>
        /// Прибыль, на величину которой выставляется заявка на закрытие позиции
        /// </summary>
        public double Profit
        {
            get { return _Profit; }
            set
            {
                if (_Profit != value)
                {
                    _Profit = value;
                    RaisePropertyChanged("Profit");
                }
            }
        }
        /// <summary>
        /// Количество контрактов/лотов, в одной выставляемой заявке
        /// </summary>
        public int Quantity
        {
            get { return _Quantity; }
            set
            {
                if (_Quantity != value)
                {
                    _Quantity = value;
                    RaisePropertyChanged("Quantity");
                }
            }
        }
        /// <summary>
        /// Вид операции по инструменту
        /// </summary>
        public string Operation
        {
            get { return _Operation; }
            set
            {
                if (_Operation != value)
                {
                    _Operation = value;
                    RaisePropertyChanged("Operation");
                }
            }
        }
        /// <summary>
        /// Максимальная цена для выставляемых заявках
        /// </summary>
        public double Maxprice
        {
            get { return _Maxprice; }
            set
            {
                if (_Maxprice != value)
                {
                    _Maxprice = value;
                    RaisePropertyChanged("Maxprice");
                }
            }
        }

        /// <summary>
        /// Количество одновременно активных заявок
        /// </summary>
        public int SumOrders
        {
            get { return _SumOrders; }
            set
            {
                if (_SumOrders != value)
                {
                    _SumOrders = value;
                    RaisePropertyChanged("SumOrders");
                }
            }
        }
        /// <summary>
        /// глубина проверки данных по цене иснтумента для выставления ордеров на открытие
        /// </summary>
        public int DeepOrders
        {
            get { return _DeepOrders; }
            set
            {
                if (_DeepOrders != value)
                {
                    _DeepOrders = value;
                    RaisePropertyChanged("DeepOrders");
                }
            }
        }
        /// <summary>
        /// коллекция активнных и исполненных сделок на открытие и закрытие позиции
        /// </summary>
        public ObservableCollection<TradesOpen> TradeList
        {
            get { return _TradeList; }
            set
            {
                if (_TradeList != value)
                {
                    _TradeList = value;
                    RaisePropertyChanged("TradeList");
                }
            }
        }

        /// <summary>
        /// Суммарная позиция по инструменту
        /// </summary>
        public int Poz
        {
            get { return _Poz; }
            set
            {
                if (_Poz != value)
                {
                    _Poz = value;
                    RaisePropertyChanged("Poz");
                }
            }
        }
        #endregion

        public LedderItem() { }

        #region event PropertyChangedEventHandler

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

        public LedderItem(SerializationInfo info, StreamingContext context)
        {
            isRun = info.GetBoolean( "isRun" );
            Account = info.GetString( "Account" );
            ClientCode = info.GetString( "ClientCode" );
            Instrument = info.GetString("Instrument");

            Step = info.GetDouble("Step");
            Profit = info.GetDouble("Profit");
            Quantity = info.GetInt32("Quantity");
            Operation = info.GetString("Operation");
            Maxprice = info.GetDouble("Maxprice");
            SumOrders = info.GetInt32("SumOrders");
            SumOrdersProfit = info.GetInt32("SumOrdersProfit");
            DeepOrders = info.GetInt32("DeepOrders");
            Check = info.GetBoolean("Check");
            TradeList = (ObservableCollection<TradesOpen>)info.GetValue("TradeList", typeof(ObservableCollection<TradesOpen>));
            Poz = info.GetInt32("Poz");
        }

        public void GetObjectData ( SerializationInfo info, StreamingContext context )
        {

            info.AddValue( "isRun", isRun );
            info.AddValue( "Account", Account );
            info.AddValue( "ClientCode", ClientCode );
            info.AddValue("Instrument", Instrument);

            info.AddValue("Step", Step);
            info.AddValue("Profit", Profit);
            info.AddValue("Quantity", Quantity);
            info.AddValue("Operation", Operation);
            info.AddValue("Maxprice", Maxprice);
            info.AddValue("SumOrders", SumOrders);
            info.AddValue("SumOrdersProfit", SumOrdersProfit);
            info.AddValue("DeepOrders", DeepOrders);
            info.AddValue("TradeList", _TradeList);
            info.AddValue("Check", Check);
            info.AddValue("Poz", Poz);
        }

    }



}
